<?php
/**
 * 页面模板函数库
 * 
 * 这个文件包含了所有页面模板相关的函数
 * 主要用于统一处理页面头部、底部和常用组件的显示
 * 通过这些函数可以保持网站页面风格的一致性
 * 
 * 主要功能：
 * - 页面头部和底部的统一渲染
 * - 导航栏的动态生成
 * - 消息提示组件
 * - 文章卡片组件
 * - 表单组件
 * - 评论组件
 * 
 * 使用方法：
 * require_once 'includes/template.php';
 * renderHeader('页面标题');
 * // 页面内容
 * renderFooter();
 */

/**
 * 输出页面头部HTML结构
 * 
 * 这个函数负责生成页面的<head>部分和导航栏
 * 会自动引入CSS文件，设置页面标题，并根据用户登录状态显示不同的导航
 * 
 * @param string $title 页面标题，会显示在浏览器标签页上
 * @param array $options 页面选项配置数组，可包含以下键：
 *                      - 'admin' => true/false 是否为管理后台页面
 *                      - 'css' => array() 额外要引入的CSS文件数组
 *                      - 'js' => array() 额外要引入的JS文件数组
 * 
 * 使用示例：
 * renderHeader('文章管理', ['admin' => true, 'css' => ['admin.css']]);
 */
function renderHeader($title = '我的博客系统', $options = []) {
    // 检查是否为管理后台页面，默认为false
    $isAdmin = isset($options['admin']) && $options['admin'];
    // 获取要额外引入的CSS文件列表
    $extraCSS = isset($options['css']) ? $options['css'] : [];
    // 获取要额外引入的JS文件列表
    $extraJS = isset($options['js']) ? $options['js'] : [];
    
    // 输出HTML文档头部结构
    echo '<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>' . escape($title) . '</title>
    <link rel="stylesheet" href="' . assetUrl('css/blog.css') . '">';
    
    // 循环输出额外的CSS文件
    // 支持相对路径和绝对URL两种方式
    foreach ($extraCSS as $css) {
        // 如果是完整的URL（http://或https://开头）
        if (filter_var($css, FILTER_VALIDATE_URL)) {
            echo '<link rel="stylesheet" href="' . $css . '">';
        } else {
            // 如果是相对路径，自动添加assets/css/前缀
            echo '<link rel="stylesheet" href="' . assetUrl('css/' . $css) . '">';
        }
    }
    
    // 结束head标签，开始body标签
    echo '</head>
<body>';
    
    // 根据页面类型输出不同的导航栏
    if ($isAdmin) {
        // 管理后台导航栏
        renderAdminNav();
    } else {
        // 前台主导航栏
        renderMainNav();
    }
}

/**
 * 输出网站主导航栏
 * 
 * 这个函数生成网站前台的主导航栏
 * 根据用户登录状态显示不同的菜单项
 * 未登录用户看到登录/注册链接
 * 已登录用户看到管理后台/发布文章/退出登录链接
 */
function renderMainNav() {
    echo '<header>
        <div class="container">
            <div class="header-content">
                <div class="logo">我的博客系统</div>
                <nav class="nav">
                    <a href="' . baseUrl() . '">首页</a>';
    
    // 检查用户是否已登录，显示对应的菜单
    if (isLoggedIn()) {
        // 已登录用户的菜单项
        echo '<a href="' . baseUrl('admin/index.php') . '">管理后台</a>
                    <a href="' . baseUrl('admin/post.php') . '">发布文章</a>
                    <a href="' . baseUrl('logout.php') . '">退出登录</a>';
    } else {
        // 未登录用户的菜单项
        echo '<a href="' . baseUrl('login.php') . '">登录</a>
                    <a href="' . baseUrl('register.php') . '">注册</a>';
    }
    
    // 结束导航栏HTML结构
    echo '</nav>
            </div>
        </div>
    </header>';
}

/**
 * 输出管理后台导航栏
 * 
 * 这个函数生成管理后台专用的导航栏
 * 包含后台管理相关的菜单项，以及当前登录用户的信息显示
 * 只有已登录用户才能看到这个导航栏
 */
function renderAdminNav() {
    // 获取当前登录用户的信息
    $currentUser = getCurrentUser();
    
    echo '<header class="admin-header">
        <div class="container">
            <div class="header-content">
                <div class="logo">博客管理后台</div>
                <div class="user-info">
                    <span>欢迎，' . escape($currentUser['用户名']) . '</span>
                    <nav class="nav-links">
                        <a href="' . baseUrl('admin/index.php') . '">后台首页</a>
                        <a href="' . baseUrl('admin/articles.php') . '">文章管理</a>
                        <a href="' . baseUrl('admin/post.php') . '">发布文章</a>
                        <a href="' . baseUrl() . '">前台首页</a>
                        <a href="' . baseUrl('logout.php') . '">退出登录</a>
                    </nav>
                </div>
            </div>
        </div>
    </header>';
}

/**
 * 输出页面底部HTML结构
 * 
 * 这个函数负责生成页面的底部内容
 * 主要是引入JavaScript文件和结束HTML文档
 * 
 * @param array $options 页面选项配置数组，可包含：
 *                      - 'js' => array() 要引入的JavaScript文件数组
 * 
 * 使用示例：
 * renderFooter(['js' => ['admin.js', 'chart.js']]);
 */
function renderFooter($options = []) {
    // 获取要额外引入的JavaScript文件列表
    $extraJS = isset($options['js']) ? $options['js'] : [];
    
    // 循环输出额外的JavaScript文件
    // 支持相对路径和绝对URL两种方式
    foreach ($extraJS as $js) {
        // 如果是完整的URL（http://或https://开头）
        if (filter_var($js, FILTER_VALIDATE_URL)) {
            echo '<script src="' . $js . '"></script>';
        } else {
            // 如果是相对路径，自动添加assets/js/前缀
            echo '<script src="' . assetUrl('js/' . $js) . '"></script>';
        }
    }
    
    // 结束HTML文档
    echo '</body>
</html>';
}

/**
 * 输出消息提示框
 * 
 * 这个函数用于显示各种类型的提示消息
 * 比如操作成功、错误提示、警告信息等
 * 会自动应用对应的CSS样式
 * 
 * @param string $message 要显示的消息内容
 * @param string $type 消息类型，支持以下值：
 *                    - 'success' 成功消息（绿色）
 *                    - 'error' 错误消息（红色）
 *                    - 'warning' 警告消息（橙色）
 *                    - 'info' 信息消息（蓝色，默认）
 * 
 * 使用示例：
 * renderMessage('文章发布成功！', 'success');
 * renderMessage('用户名或密码错误', 'error');
 */
function renderMessage($message, $type = 'info') {
    // 只有在消息不为空时才显示
    if (!empty($message)) {
        echo '<div class="alert alert-' . escape($type) . '">' . escape($message) . '</div>';
    }
}

/**
 * 输出页面标题区域
 * 
 * 这个函数生成页面的标题头部区域
 * 通常用在内容页面的顶部，显示页面标题和副标题
 * 
 * @param string $title 主标题文本
 * @param string $subtitle 副标题文本（可选）
 * 
 * 使用示例：
 * renderPageHeader('文章管理', '管理所有已发布的文章');
 */
function renderPageHeader($title, $subtitle = '') {
    echo '<div class="card">
        <div class="card-header">
            <h1 class="card-title">' . escape($title) . '</h1>';
    
    // 如果有副标题，则显示副标题
    if ($subtitle) {
        echo '<p class="card-subtitle">' . escape($subtitle) . '</p>';
    }
    
    echo '</div>
    </div>';
}

/**
 * 输出文章卡片组件
 * 
 * 这个函数用于在文章列表页面显示单篇文章的卡片
 * 包含文章标题、作者、发布时间、摘要、统计信息等
 * 支持置顶和推荐标签的显示
 * 
 * @param array $article 文章数据数组，必须包含以下字段：
 *                      - 'id' 文章ID
 *                      - '标题' 文章标题
 *                      - '内容' 文章内容
 *                      - '用户名' 作者用户名
 *                      - '创建时间' 发布时间
 *                      - '阅读量' 阅读次数
 *                      - '点赞量' 点赞次数
 *                      - '评论量' 评论次数
 *                      - '是否置顶' 是否置顶（1/0）
 *                      - '是否推荐' 是否推荐（1/0）
 * 
 * 使用示例：
 * foreach ($articles as $article) {
 *     renderArticleCard($article);
 * }
 */
function renderArticleCard($article) {
    // 使用全局的博客系统对象
    global $blog;
    
    echo '<article class="article-item">
        <h3 class="article-title">
            <a href="' . baseUrl('article.php?id=' . $article['id']) . '">
                ' . escape($article['标题']) . '
            </a>';
    
    // 如果文章被设置为置顶，显示置顶标签
    if ($article['是否置顶']) {
        echo '<span class="badge badge-top">置顶</span>';
    }
    // 如果文章被设置为推荐，显示推荐标签
    if ($article['是否推荐']) {
        echo '<span class="badge badge-recommend">推荐</span>';
    }
    
    echo '</h3>
        <p class="article-meta">
            作者：' . escape($article['用户名']) . ' | 
            发布时间：' . $blog->formatDate($article['创建时间']) . ' | 
            阅读量：' . $article['阅读量'] . ' | 
            点赞：' . $article['点赞量'] . ' | 
            评论：' . $article['评论量'] . '
        </p>
        <div class="article-content">
            ' . $blog->getExcerpt($article['内容'], 300) . '
        </div>
        <div class="article-footer">
            <a href="' . baseUrl('article.php?id=' . $article['id']) . '" class="read-more">阅读全文</a>
        </div>
    </article>';
}

/**
 * 输出统计数据卡片网格
 * 
 * 这个函数用于在管理后台首页显示网站的统计数据
 * 以卡片网格的形式展示用户数、文章数、评论数等信息
 * 
 * @param array $stats 统计数据数组，应包含以下字段：
 *                    - 'total_users' 用户总数
 *                    - 'total_articles' 文章总数
 *                    - 'total_comments' 评论总数
 *                    - 'total_views' 总浏览量（可选）
 * 
 * 使用示例：
 * $stats = $blog->getStats();
 * renderStatsCards($stats);
 */
function renderStatsCards($stats) {
    echo '<div class="stats-grid">
        <div class="stat-card">
            <div class="stat-number">' . $stats['total_users'] . '</div>
            <div class="stat-label">用户总数</div>
        </div>
        <div class="stat-card">
            <div class="stat-number">' . $stats['total_articles'] . '</div>
            <div class="stat-label">文章总数</div>
        </div>
        <div class="stat-card">
            <div class="stat-number">' . $stats['total_comments'] . '</div>
            <div class="stat-label">评论总数</div>
        </div>
        <div class="stat-card">
            <div class="stat-number">' . ($stats['total_views'] ?? 0) . '</div>
            <div class="stat-label">总阅读量</div>
        </div>
        <div class="stat-card">
            <div class="stat-number">' . ($stats['total_likes'] ?? 0) . '</div>
            <div class="stat-label">总点赞量</div>
        </div>
    </div>';
}

/**
 * 输出表单输入字段组件
 * 
 * 这个函数用于生成标准的表单输入字段
 * 支持多种输入类型，包括文本框、密码框、文本域等
 * 自动处理字段验证、帮助文本、占位符等功能
 * 
 * @param string $type 字段类型，支持：
 *                    - 'text' 普通文本输入框
 *                    - 'password' 密码输入框
 *                    - 'email' 邮箱输入框
 *                    - 'textarea' 多行文本域
 *                    - 'number' 数字输入框
 * @param string $name 字段的name属性，用于表单提交
 * @param string $label 字段的显示标签文本
 * @param array $options 额外选项配置，可包含：
 *                      - 'value' => string 字段的默认值
 *                      - 'placeholder' => string 占位符文本
 *                      - 'required' => bool 是否为必填字段
 *                      - 'help' => string 帮助提示文本
 * 
 * 使用示例：
 * renderFormField('text', 'title', '文章标题', [
 *     'placeholder' => '请输入文章标题',
 *     'required' => true,
 *     'help' => '标题不能超过100个字符'
 * ]);
 */
function renderFormField($type, $name, $label, $options = []) {
    // 从选项中提取各种配置参数
    $value = isset($options['value']) ? $options['value'] : '';
    $placeholder = isset($options['placeholder']) ? $options['placeholder'] : '';
    $required = isset($options['required']) && $options['required'];
    $help = isset($options['help']) ? $options['help'] : '';
    
    // 开始输出表单组的HTML结构
    echo '<div class="form-group">
        <label for="' . escape($name) . '">' . escape($label);
    
    // 如果是必填字段，在标签后添加星号标记
    if ($required) {
        echo ' *';
    }
    
    echo '</label>';
    
    // 根据字段类型生成不同的输入控件
    if ($type === 'textarea') {
        // 多行文本域
        echo '<textarea id="' . escape($name) . '" name="' . escape($name) . '" class="form-control"';
        if ($placeholder) echo ' placeholder="' . escape($placeholder) . '"';
        if ($required) echo ' required';
        echo '>' . escape($value) . '</textarea>';
    } else {
        // 单行输入框（text、password、email等）
        echo '<input type="' . escape($type) . '" id="' . escape($name) . '" name="' . escape($name) . '" class="form-control"';
        if ($value) echo ' value="' . escape($value) . '"';
        if ($placeholder) echo ' placeholder="' . escape($placeholder) . '"';
        if ($required) echo ' required';
        echo '>';
    }
    
    // 如果有帮助文本，显示在输入框下方
    if ($help) {
        echo '<div class="help-text">' . escape($help) . '</div>';
    }
    
    echo '</div>';
}

/**
 * 输出复选框组组件
 * 
 * 这个函数用于生成一组复选框，常用于多选场景
 * 比如选择文章分类、标签等多选项功能
 * 
 * @param string $name 字段名称，会作为input的name属性（自动添加[]后缀）
 * @param string $label 复选框组的标签文本
 * @param array $options 选项数组，格式为 ['值' => '显示文本', ...]
 * @param array $selected 已选中的值数组
 * 
 * 使用示例：
 * $categories = ['1' => '技术', '2' => '生活', '3' => '随笔'];
 * $selected = ['1', '3'];
 * renderCheckboxGroup('categories', '选择分类', $categories, $selected);
 */
function renderCheckboxGroup($name, $label, $options, $selected = []) {
    echo '<div class="form-group">
        <label>' . escape($label) . '</label>
        <div class="checkbox-group">';
    
    // 循环生成每个复选框选项
    foreach ($options as $value => $text) {
        // 检查当前选项是否应该被选中
        $checked = in_array($value, $selected) ? ' checked' : '';
        echo '<div class="checkbox-item">
            <input type="checkbox" id="' . escape($name . '_' . $value) . '" name="' . escape($name) . '[]" value="' . escape($value) . '"' . $checked . '>
            <label for="' . escape($name . '_' . $value) . '">' . escape($text) . '</label>
        </div>';
    }
    
    echo '</div>
    </div>';
}

/**
 * 输出评论列表组件
 * 
 * 这个函数用于显示文章的评论列表
 * 支持评论的编辑和删除功能（仅限评论作者）
 * 会自动处理评论时间格式化和用户权限检查
 * 
 * @param array $comments 评论数据数组，每个评论应包含：
 *                       - 'id' 评论ID
 *                       - '内容' 评论内容
 *                       - '用户名' 评论者用户名
 *                       - '创建时间' 评论时间
 *                       - '用户ID' 评论者用户ID
 * @param int|null $currentUserId 当前登录用户的ID，用于权限判断
 * 
 * 使用示例：
 * $comments = $blog->getComments($articleId);
 * $currentUserId = isLoggedIn() ? $_SESSION['user_id'] : null;
 * renderComments($comments, $currentUserId);
 */
function renderComments($comments, $currentUserId = null) {
    global $blog;
    
    if (empty($comments)) {
        echo '<p class="text-center">暂无评论，快来发表第一条评论吧！</p>';
        return;
    }
    
    echo '<ul class="comment-list">';
    
    foreach ($comments as $comment) {
        echo '<li class="comment-item">
            <div class="comment-header">
                <span class="comment-author">' . escape($comment['用户名']) . '</span>
                <span class="comment-time">' . $blog->formatDate($comment['评论时间']) . '</span>
            </div>
            <div class="comment-content">' . escape($comment['评论内容']) . '</div>';
        
        // 如果是评论作者，显示操作按钮
        if ($currentUserId && $comment['评论用户ID'] == $currentUserId) {
            echo '<div class="comment-actions">
                <form method="POST" style="display: inline;">
                    ' . csrfField() . '
                    <input type="hidden" name="comment_id" value="' . $comment['comment_id'] . '">
                    <button type="submit" name="delete_comment" class="btn btn-danger btn-small">删除</button>
                </form>
            </div>';
        }
        
        echo '</li>';
    }
    
    echo '</ul>';
}

/**
 * 输出空状态提示
 * @param string $title 标题
 * @param string $message 消息
 * @param string $action 操作链接
 */
function renderEmptyState($title, $message, $action = '') {
    echo '<div class="card text-center">
        <h3>' . escape($title) . '</h3>
        <p>' . escape($message) . '</p>';
    
    if ($action) {
        echo '<div style="margin-top: 20px;">' . $action . '</div>';
    }
    
    echo '</div>';
}
?> 